home *** CD-ROM | disk | FTP | other *** search
- Subject: v16i089: Archive net sources groups
- Newsgroups: comp.sources.unix
- Approved: rsalz@uunet.UU.NET
-
- Submitted-by: Geoff Leach <laticorp!geoff>
- Posting-number: Volume 16, Issue 89
- Archive-name: narc
-
-
- Narc is a collection of tools to help you with your NetNews habit.
- They're intended to minimize the effort involved in saving and
- cataloging sources from the Net. The posting consists of one C source
- and a number of C shell scripts. The C program was developed under Sun OS,
- but contains nothing that would make a System V or Xenix port difficult.
- The C shell scripts are another matter, of course.
-
- What you have here is tools to capture the postings as they arrive and
- organize them as they are completed. The author spends a few minutes
- each day and gets everything he wants.
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of shell archive."
- # Contents: README CheckManifest.1 MakeArchiveIndex.1 assemble.1
- # narc.1 roffit.1 CheckManifest.csh MakeArchiveIndex.csh
- # assemble.csh makemap.csh roffit.csh narc.c patchlevel.h version.h
- # Makefile
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'README' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'README'\"
- else
- echo shar: Extracting \"'README'\" \(2179 characters\)
- sed "s/^X//" >'README' <<'END_OF_FILE'
- X Did you ever fail to capture a postings because it was too much hassle,
- X only to wish you had done so a few months later? Hopefully its now not
- X so much of a problem.
- X
- X This posting provides you with some relief for your NetNews habit. In
- X particular, it helps you with the capture and organization of your
- X archive of NetNews source postings. The posting consists of a single C
- X program and a few Csh scripts. The program was developed under Sun OS
- X 3.4 (i.e., BSD) but should not be too difficult to port to Xenix or
- X System V. The Csh scripts may be another matter. Perhaps a Perl port?
- X
- X What you have here is tools to capture the postings as they arrive and
- X organize them as they are completed. The author spends a few minutes
- X each day and gets everything he wants.
- X
- X Aliases and a configuration file, .narcrc, are part of the total system.
- X Here are the ones that the author finds useful.
- X
- X alias ton 'pushd $ARCHIVE/$ARCDIR/$ARCVOL'
- X alias arc 'setenv ARCDIR \!*'
- X alias vol 'setenv ARCVOL v\!*'
- X alias text 'setenv ARCDIR text; setenv ARCVOL '
- X alias alt 'setenv ARCDIR alt; setenv ARCVOL '
- X alias doc 'setenv ARCDIR doc; setenv ARCVOL '
- X alias unix 'setenv ARCDIR unix; setenv ARCVOL v16'
- X alias misc 'setenv ARCDIR misc; setenv ARCVOL v04'
- X alias games 'setenv ARCDIR games; setenv ARCVOL v05'
- X alias x 'setenv ARCDIR x; setenv ARCVOL v01'
- X
- X and from his .narcrc file
- X
- X comp.sources.unix:unix:Posting-number
- X comp.sources.misc:misc:Posting-number
- X comp.sources.games:games:Comp.sources.games
- X comp.sources.x:x:Posting-number
- X alt.sources:alt
- X comp.doc:doc
- X comp.text:text
- X
- X Suggestions and bug reports are welcome. I'd particularly like to
- X hear from Xenix and System V users who might wish to contribute diffs
- X for their particular environments. Or a /bin/sh port of the scripts.
- X Whatever.
- X
- X I've also included makemap.csh. I spent some time figuring out a
- X way to make use of the UseNet maps in a way that (a) did not require
- X a bunch of repeat processing and (b) did not require the deletion
- X of the posting after processing. This is my solution.
- X
- X Enjoy!
- X
- X Geoffrey Leach
- X {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- END_OF_FILE
- if test 2179 -ne `wc -c <'README'`; then
- echo shar: \"'README'\" unpacked with wrong size!
- fi
- # end of 'README'
- fi
- if test -f 'CheckManifest.1' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'CheckManifest.1'\"
- else
- echo shar: Extracting \"'CheckManifest.1'\" \(978 characters\)
- sed "s/^X//" >'CheckManifest.1' <<'END_OF_FILE'
- X.TH CHECKMANIFEST 1 "7 October 1988"
- X.SH NAME
- XCheckManifest \- Check the manifest from a posting against the delivered files.
- X.sp
- X.SH SYNOPSIS
- X.B CheckManifest [
- X.I manifest-file
- X.B ]
- X.sp
- X.SH DESCRIPTION
- X.I CheckManifest
- Xis a C\-shell script that checks the files in the current directory
- Xagainst a manifest. The manifest is sought in files named
- X.I MANIFEST
- Xor
- X.I Manifest.
- XOptionally, the
- X.I manifest-file
- Xmay be specified on the command line.
- X.sp
- X.SH OPTIONS
- X.IP "manifest-file" .5i
- XOverrides default file name.
- X.sp
- X.SH DIAGNOSTICS
- X.I file-name
- Xnot delivered.
- X.sp
- X.SH FILES
- X.IP "MANIFEST" .5i
- XDefault name for manifest file.
- X.IP "Manifest" .5i
- XAnother default name for manifest file.
- X.sp
- X.SH BUGS
- XThe manifest file format is not standardized. Confusion may result.
- XNot a Bourne shell script (sorry).
- XWould probably be better as a
- X.I perl
- Xscript.
- X.sp
- X.SH SEE ALSO
- Xassemble(1)
- X.sp
- X.SH AUTHOR
- X.PP
- XGeoffrey Leach
- X.br
- X.I {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- END_OF_FILE
- if test 978 -ne `wc -c <'CheckManifest.1'`; then
- echo shar: \"'CheckManifest.1'\" unpacked with wrong size!
- fi
- # end of 'CheckManifest.1'
- fi
- if test -f 'MakeArchiveIndex.1' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'MakeArchiveIndex.1'\"
- else
- echo shar: Extracting \"'MakeArchiveIndex.1'\" \(796 characters\)
- sed "s/^X//" >'MakeArchiveIndex.1' <<'END_OF_FILE'
- X.TH MAKEARCHIVEINDEX 1 "7 October 1988"
- X.SH NAME
- XMakeArchiveIndex \- Gather individual indices into a sorted master file.
- X.sb
- XPrintArchiveIndex \- Print individual archive directories.
- X.sp
- X.SH SYNOPSIS
- X.B MakeArchiveIndex
- X.br
- X.B PrintArchiveIndex
- X.sp
- X.SH DESCRIPTION
- X.I MakeArchiveIndex
- Xis a C\-shell script that gathers together the
- X.I Index
- Xfiles in the given list of directories formats and sorts them.
- X.sp
- X.I PrintArchiveIndex
- Xprints the directory listings of the directories in the archive.
- X.sp
- X.SH OPTIONS
- XNone.
- X.sp
- X.SH DIAGNOSTICS
- XNone.
- X.sp
- X.SH FILES
- X.IP "Index" .5i
- XCreated by the user in each archive directory.
- X.sp
- X.SH BUGS
- XNot a Bourne shell script (sorry).
- X.sp
- X.SH SEE ALSO
- Xassemble(1)
- X.sp
- X.SH AUTHOR
- X.PP
- XGeoffrey Leach
- X.br
- X.I {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- END_OF_FILE
- if test 796 -ne `wc -c <'MakeArchiveIndex.1'`; then
- echo shar: \"'MakeArchiveIndex.1'\" unpacked with wrong size!
- fi
- # end of 'MakeArchiveIndex.1'
- fi
- if test -f 'assemble.1' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'assemble.1'\"
- else
- echo shar: Extracting \"'assemble.1'\" \(6441 characters\)
- sed "s/^X//" >'assemble.1' <<'END_OF_FILE'
- X.TH ASSEMBLE 1 "7 October 1988"
- X.SH NAME
- Xassemble \- gather files that constitute a posting into a single directory
- X.br
- Xarchive \- move program directory into the appropriate place in an archive tree
- X.br
- Xretrieve \- put an expanded archive file in the current directory
- X.sp
- X.SH SYNOPSIS
- X.B assemble [\-a \fIarchive-directory \fB[\-v \fIarchive-volume\fB]]
- X[-s] [\-e \fIfile-name ...\fB]
- X.ti 1.0i
- X.br
- X.B \-n
- X.I archive-name \ first-issue
- X.B [\fInumber-of-issues\fB]
- X.sp
- X.B archive [\-a \fIarchive-directory \fB[\-v \fIarchive-volume\fB]]
- X.I archive-name
- X.sp
- X.B retrieve [\-a \fIarchive-directory \fB[\-v \fIarchive-volume\fB]]
- X.I archive-name
- X.sp
- X.SH DESCRIPTION
- X.I Assemble
- Xis a C\-shell script that permits the assembly of a group of related
- Xfiles (generally from UseNet newsgroup postings) into
- X.I archive-name
- Xfor archiving. Unshar (or tar) is applied to the files, which are then moved
- Xinto a subdirectory for later removal.
- XIf
- X.I uhshar
- Xproduces a
- X.I .hdr
- Xheader file, it is moved into
- X.I HDRS;
- Xsaving headers can be helpful in identifying the source
- Xof the posting at a later date. The names of the files themselves
- Xare saved in
- X.I FILES
- Xand will be deleted by
- X.I assemble.
- XIf a manifest is posted, it will be checked. If files with
- Xan appropriate extension (.man, .nro, .[1-8]) are found within the directory,
- X.I nroff \-man
- Xwill be applied to each, the result being stored in a subdirectory
- Xunder
- X.I manl
- Xwithin the archive.
- X.sp
- XThe files to be
- X.I assembled
- Xmay be specified either as a starting issue number (with optional number
- Xof issues) or (with the
- X.B \-e
- Xoption), a file name.
- XIn the former case, the name of the file to be retrieved is implied
- Xfrom the name of the
- X.B ARCVOL
- Xdirectory. For instance, if we are
- Xdealing with comp.sources.unix volume 16, we will be
- X.I assembling
- Xfiles whose name is of the form
- X.I v16innn.
- XAssuming that the archive has been set up with
- X.B ARCDIR
- Xset to "unix"
- X.B ARCVOL
- Xset to "16",
- X.I assemble \-n example 23 4
- Xwill assemble
- X.Iv16i023, v16i024, v16i025
- Xand
- X.I v16i026
- Xfrom
- X.I unix/v16
- Xrelative to the base directory specified by
- X.B ARCHIVE
- Xinto the directory
- X.I example
- X.sp
- X.I Archive
- Xis a C\-shell script that permits an
- X.I assembled
- Xset of files to be archived in the user's archive hierarchy.
- XThe directory specified by
- X.I archive-name
- Xis saved as a compressed tar file.
- XIf
- X.I archive-name.tar.Z
- Xexists, it is silently replaced by the new file.
- XWithin the
- X.I archive-name
- Xdirectory, the directory
- X.I ARCF
- Xis removed and the files specified by
- X.I FILES
- Xare deleted.
- X.sp
- X.I Retrieve
- Xis a C\-shell script that permits an
- X.I archived
- Xdirectory to be copied form the archive hierarchy and restored in
- Xconventional form in the current directory.
- XThe archive file is untouched.
- X.sp
- X.SH OPTIONS
- X.IP "\-a archive-directory" .5i
- XThe archive directory. This directory (which must already exist)
- Xis on the first level below the archive base, which is specified by the
- Xenvironment variable
- X.B ARCHIVE.
- XThe specification for
- X.B \-a
- Xoverrides the value of the environment variable
- X.B ARCDIR.
- XIf
- X.B \-a
- Xis used,
- X.B \-v
- Xis required.
- X.sp
- X.IP "\-e" .5i
- XThe
- X.I extract
- Xflag can be set to indicated that even though a directory
- Xis a moderated newsgroup, the file(s) are to be extracted
- Xby name rather than by number.
- XThis option is useful if you are re-organizing an existing directory.
- X.sp
- X.IP "\-n archive-name" .5i
- XThe name
- Xgiven to the directory into which files are
- X.I assembled
- Xand from which an archive file is created by
- X.I archive.
- XThe
- X.I archive-name
- Xgiven to
- X.I retrieve
- Ximplies
- X.I archive-name.tar.Z
- Xwithin the archive directory.
- X.sp
- X.IP "\-s" .5i
- XShort assemble. "Just the files, ma'm."
- X.sp
- X.IP "\-v archive-volume" .5i
- XThe archive volume. This directory (which must already exist)
- Xis on the second level of the archive, below
- X.B ARCDIR.
- XIt is useful for the management of moderated newsgroups.
- X.B \-v
- Xoverrides the value of the environment variable
- X.B ARCVOL.
- XIf
- X.B\-a
- Xis used,
- X.B\-v
- Xis required.
- X.sp
- X.SH ENVIRONMENT VARIABLES
- X.IP "ARCHIVE" .5i
- XSpecifies the path (full or relative, as appropriate) for the
- Xdirectory in which the archives directories are maintained.
- X.B ARCHIVE
- Xmust be defined, or an equivalent definition made in
- X.I assemble
- Xand
- X.I narc.
- X.sp
- X.IP "ARCDIR" .5i
- XSpecifies the volume used for archiving.
- XIf not defined,
- X.B \-a
- Xmust be used with all commands. Value is overridden by
- X.B \-a.
- X.sp
- X.IP "ARCVOL" .5i
- XSpecifies the volume used for archiving. Relevant only if
- X.B ARCDIR
- Xis a moderated newsgroup. If not defined,
- X.B \-v
- Xmust be used with all commands. Value is overridden by
- X.B \-v.
- X.sp
- X.SH DIAGNOSTICS
- XPrompts are provided if
- X.I archive-directory
- Xor
- X.I archive-name
- Xis missing where required.
- X.sp
- X"File not found" is given if a file specified or implied by a command is not
- Xlocated, but the script will attempt to go on, especially if a range of files
- Xis implied.
- X.sp
- X.I CheckManifest
- Xand
- X.I roffit
- XAre called by
- X.I assemble.
- XThey have their own diagnostics.
- X.sp
- X.SH FILES
- X.IP "ARCF" .5i
- XSubdirectory created to hold the original files prior to deletion by
- X.I archive.
- X.sp
- X.IP "FILES" .5i
- XList of files used to create the archive. Created by
- X.I assemble
- Xfor deletion by
- X.I archive.
- X.sp
- X.IP "HDRS" .5i
- XA subdirectory created for the saving of the
- X.I .hdr
- Xfile left behind by the action of (some)
- X.I unshar
- Xprograms.
- X.sp
- X.IP "manl" .5i
- XA subdirectory in the
- X.B ARCHIVE
- Xdirectory where a subdirectory for
- X.I archive-name
- Xis created to hold formatted man pages.
- X.sp
- X.IP "PATCHES" .5i
- XA handy directory created for later collection of patches.
- X.sp
- X.bp
- X.SH EXAMPLE
- XHere is a sample archive directory:
- X.sp
- X.nf
- X/dbase/central/news/netsrc/x:
- Xv00 v01
- X
- X/dbase/central/news/netsrc/x/v00:
- XIndex Indexr awm.tar.Z xwatch.tar.Z
- X
- X/dbase/central/news/netsrc/x/v01:
- XIndex menupane.tar.Z xfig.tar.Z xmoire.tar.Z xsecure.tar.Z
- XIndexr qix.tar.Z xipr.tar.Z xphoon.tar.Z xtools.tar.Z
- Xdclock.tar.Z twm.tar.Z xmille.tar.Z xplaces.tar.Z
- X.fi
- X.sp
- X.SH BUGS
- XIndividual users will want to modify to their tastes and needs.
- XThe author is continually fiddling with them.
- X.I Assemble
- Xassumes you're using the version of
- X.I shar
- Xposted by Rick $altz to comp.sources.unix.
- XNot a Bourne shell script (sorry).
- XWould probably be better as a
- X.I perl
- Xscript.
- X.sp
- X.SH SEE ALSO
- Xnarc(1), unshar(1), compress(1), tar(1), CheckManifest(1), roffit(1)
- X.sp
- X.SH AUTHOR
- X.PP
- XGeoffrey Leach
- X.br
- X.I {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- END_OF_FILE
- if test 6441 -ne `wc -c <'assemble.1'`; then
- echo shar: \"'assemble.1'\" unpacked with wrong size!
- fi
- # end of 'assemble.1'
- fi
- if test -f 'narc.1' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'narc.1'\"
- else
- echo shar: Extracting \"'narc.1'\" \(4873 characters\)
- sed "s/^X//" >'narc.1' <<'END_OF_FILE'
- X.TH NARC 1 "1 September 1988"
- X.SH NAME
- Xnarc \- take files from a newsreader and place them in a place suitable
- Xfor
- X.I assemble(1).
- X.sp
- X.SH SYNOPSIS
- X.B narc
- X.B [\-px] [\-a
- X.I archive-directory
- X.B [\-v
- X.I archive-volume
- X.B ]]
- X.sp
- X.SH DESCRIPTION
- X.I narc
- X(\fBN\fRetnews \fBARC\fRhive) takes a stream of articles from
- X.I stdin
- Xand figures out where they go, based on the
- X.I .narcrc
- Xfile in the user's home directory. If
- X.I .narcrc
- Xdoes not mention the newsgroup, the user will be prompted, if s/he has
- Xnot specified a treatment with
- X.B \-a.
- XThe first newsfile or
- X.B \-a
- Xsetting determines treatment for the entire run.
- X.sp
- XIf he newsgroup is moderated, a volume subdirectory and the file name
- Xwithin that directory are determined from the posting. Otherwise,
- Xa three-digit name is given to the file, with numbering being
- Xsupplied by a file
- X.I .names
- Xwithin the archive directory. This file is created by
- X.I narc
- Xas required. It ensures unique naming for files being saved
- X.I en bloc.
- X.sp
- X.SH OPTIONS
- XAn illegal option will produce a diagnostic and a usage message.
- X.IP "\-a archive-directory" .5i
- XThe archive directory. This directory (which must already exist)
- Xis on the first level below the archive base, which is specified by the
- Xenvironment variable
- X.B ARCHIVE.
- XThe specification for
- X.B \-a
- Xoverrides the value of the environment variable
- X.B ARCDIR.
- X.sp
- X.IP "\-p" .5i
- XThe
- X.I prompt
- Xflag will cause the user to be prompted for an archive volume and for
- Xthe name of each of the files into which the articles are to be saved.
- X.sp
- X.IP "\-v archive-volume" .5i
- XThe archive volume. This directory (which must already exist)
- Xis on the second level of the archive, below
- X.B ARCDIR.
- XIt is useful for the management of moderated newsgroups.
- X.B \-v
- Xoverrides the value of the environment variable
- X.B ARCVOL.
- X.sp
- X.IP "\-x" .5i
- XDebugging.
- X.I Narc
- Xwill tell you what its going to do, but then do it in the
- X.I cwd
- Xinstead.
- X.sp
- X.SH ENVIRONMENT VARIABLES
- X.IP "ARCHIVE" .5i
- XSpecifies the path for the
- Xdirectory in which the archives directories are maintained.
- X.B ARCHIVE
- Xmust be defined, or an equivalent definition made in
- X.I assemble
- Xand
- X.I narc.
- X.sp
- X.SH FILES
- X.IP "~/.narcrc" .5i
- XColon-separated fields that describe what to do for standard newsgroups.
- XIn the format:
- X.sp
- X.ta 1i 2i
- X newsgroup:archive-directory[:volume-tag]
- X.sp
- Xwhere the interpretation of the colon-separated fields is as follows.
- X.sp
- X.in 1i
- X.ip "newsgroup"
- XThe
- X.I first
- Xname to be found on the "Newsgroups: " line in the article header.
- X.ip "archive-directory"
- XThe directory associated with this newsgroup.
- X.ip "volume-tag"
- XThe beginning of the line in the archive header
- Xthat flags the line that specifies the volume in a moderated newsgroup.
- XIf this entry is empty, an un-moderated newsgroup is implied.
- X.sp
- XThe \fI.narcrc\fR entry for
- X.I comp.sources.unix
- Xis:
- X.sp
- X comp.sources.unix:unix:Posting-number
- X.sp
- XThis is because the header for postings to this newsgroup has the entries
- X.sp
- X Newsgroups: comp.sources.unix
- X.br
- Xand
- X.br
- X Posting-number: Volume 16, Issue 1
- X.sp
- XThe volume-tag field is needed because not all moderated newsgroups
- Xuse the same header to identify the current volume for the archive.
- XOn the other hand, they all use the header
- X.sp
- X Archive-name: <stuff>
- X.sp
- Xto identify the name of the archive entry.
- X.sp
- X.IP ".names" .5i
- XCreated in archive directory for un-moderated newsgroup to keep track of
- Xsaved articles.
- X.sp
- X.IP "Indexr" .5i
- XCreated in each archive directory to receive subject line (slightly modified)
- Xfor each article saved in that directory. It's expected that the user
- Xwill extract one line for each group of related articles, clean it up
- Xand place it in the Index file in that directory.
- X.sp
- X.SH DIAGNOSTICS
- X.IP "<filename> exists! (a)ppend, (i)gnore or (r)eplace [r]? " 0.5i
- XYou've already saved a file by this name. Its not a repost, because we handle
- Xthat case.
- X.sp
- X.IP "Unable to rename %s" 0.5i
- XFailure from the rename system call.
- X.sp
- X.IP "Could not find newsgroup (or volume) within nnn lines" 0.5i
- X\fINarc\fR must read ahead in the input stream to find the headers. Because
- Xinput may be from a pipe, it must buffer in order to re-process what's already
- Xscanned. You've just exceeded the size of the buffer!
- XEither this the Newsgroup header is missing or your favorite moderator has
- Xpermitted an article to slip through without the volume-tag header.
- X.sp
- X.IP "Archive directory for %s? " 0.5i
- XThe article you are processing is not one of those listed in your
- X\fI.narcrc\fR file. You need to specify an archive directory.
- X.sp
- X.IP "Could not chdir to <directory>" 0.5i
- XSorry, \fIchdir\fR failed.
- X.sp
- X.IP "Error opening %s" 0.5i
- XGeneral-purpose error message, with interpreted system error to follow.
- X.sp
- X.SH SEE ALSO
- Xassemble(1)
- X.sp
- X.SH AUTHOR
- X.PP
- XGeoffrey Leach
- X.br
- X.I {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- END_OF_FILE
- if test 4873 -ne `wc -c <'narc.1'`; then
- echo shar: \"'narc.1'\" unpacked with wrong size!
- fi
- # end of 'narc.1'
- fi
- if test -f 'roffit.1' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'roffit.1'\"
- else
- echo shar: Extracting \"'roffit.1'\" \(1148 characters\)
- sed "s/^X//" >'roffit.1' <<'END_OF_FILE'
- X.TH ROFFIT 1 "7 October 1988"
- X.SH NAME
- Xroffit \- Look for files which might contain man page documentation and
- Xformat them into the
- X.I manl
- Xdirectory in the archive hierarchy.
- X.sp
- X.SH SYNOPSIS
- X.B roffit [
- X.I man-files
- X.B ]
- X.sp
- X.SH DESCRIPTION
- X.I Roffit
- Xis a C\-shell script which checks the files in the current directory tree
- Xfor files with extensions
- X.I l, man, nro and [1-8]
- Xand applies
- X.I nroff -man
- Xto each, directing the output to the
- X.I manl
- Xdirectory in the archive hierarchy. If name conflicts arise, the user
- Xis prompted.
- X.sp
- X.SH OPTIONS
- X.IP "man-file" .5i
- XProcess these files instead of searching.
- X.sp
- X.SH ENVIRONMENT VARIABLES
- X.IP "ARCHIVE" .5i
- XThe location of the archive hierarchy.
- X.sp
- X.SH BUGS
- XNot a Bourne shell script (sorry).
- X.sp
- X.SH DIAGNOSTICS
- X.IP "Man page <file> exists. (i)gnore, (o)verwrite or new name(n) [i]? " 0.5i
- XAll of the formatted man pages are placed in the same directory.
- XOften, a posting will include some useful items that are not
- Xuniversally available. Getopt(3) often shows up.
- X.sp
- X.SH SEE ALSO
- Xassemble(1)
- X.sp
- X.SH AUTHOR
- X.PP
- XGeoffrey Leach
- X.br
- X.I {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- END_OF_FILE
- if test 1148 -ne `wc -c <'roffit.1'`; then
- echo shar: \"'roffit.1'\" unpacked with wrong size!
- fi
- # end of 'roffit.1'
- fi
- if test -f 'CheckManifest.csh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'CheckManifest.csh'\"
- else
- echo shar: Extracting \"'CheckManifest.csh'\" \(520 characters\)
- sed "s/^X//" >'CheckManifest.csh' <<'END_OF_FILE'
- X#! /bin/csh -f
- X
- X# If there's a manifest here, check it against what's been delivered
- X
- X# Geoffrey Leach
- X# LatiCorp Inc.
- X# {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- X
- Xif ( $#argv == 1 ) then
- X set MANIFEST = $1
- Xelse
- X if ( -e MANIFEST ) then
- X set MANIFEST = "MANIFEST"
- X else
- X if ( -e Manifest ) set MANIFEST = "Manifest"
- X endif
- Xendif
- Xif ( $?MANIFEST ) then
- X echo Checking manifest
- X foreach f ( `awk '{if ( NR > 2 ) print $1}' ${MANIFEST}` )
- X if ( ! -e $f ) echo $f not delivered
- X end
- Xendif
- END_OF_FILE
- if test 520 -ne `wc -c <'CheckManifest.csh'`; then
- echo shar: \"'CheckManifest.csh'\" unpacked with wrong size!
- fi
- chmod +x 'CheckManifest.csh'
- # end of 'CheckManifest.csh'
- fi
- if test -f 'MakeArchiveIndex.csh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'MakeArchiveIndex.csh'\"
- else
- echo shar: Extracting \"'MakeArchiveIndex.csh'\" \(1261 characters\)
- sed "s/^X//" >'MakeArchiveIndex.csh' <<'END_OF_FILE'
- X#! /bin/csh -f
- X
- X# Geoffrey Leach
- X# LatiCorp Inc.
- X# {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- X
- Xset NAME = $0
- Xset NAME = $NAME:t
- X
- Xset LIST = ( \
- X games/v00 \
- X games/v01 \
- X games/v02 \
- X games/v03 \
- X games/v04 \
- X games/v05 \
- X misc/v02 \
- X misc/v03 \
- X misc/v04 \
- X misc/v05 \
- X x/v00 \
- X x/v01 \
- X x/v02 \
- X unix/v00 \
- X unix/v01 \
- X unix/v02 \
- X unix/v03 \
- X unix/v04 \
- X unix/v05 \
- X unix/v06 \
- X unix/v07 \
- X unix/v08 \
- X unix/v09 \
- X unix/v10 \
- X unix/v11 \
- X unix/v12 \
- X unix/v13 \
- X unix/v14 \
- X unix/v15 \
- X unix/v16 \
- X benchmarks \
- X graphics \
- X patches \
- X lang \
- X util \
- X text \
- X gnu \
- X doc \
- X dos \
- X lib \
- X alt )
- X
- Xcd $ARCHIVE
- Xswitch ( $NAME )
- X case MakeArchiveIndex:
- X if ( -e I ) rm I
- X foreach f ( ${LIST} )
- X awk -F: '{n = $1 " (" v "):"; \
- X if ( substr($2, 1, 1) == "\t" ) $2 = substr($2, 2); \
- X if ( substr($2, 1, 1) == "\t" ) $2 = substr($2, 2); \
- X $2 = substr($2,1,46); \
- X if ( length(n) < 8 ) n = n "\t"; \
- X if ( length(n) < 16 ) n = n "\t"; \
- X if ( length(n) < 24 ) n = n "\t"; \
- X printf "%s\t%s\n", n, $2 }' v=$f $f/Index >> I
- X end
- X sort -f I > Index
- X rm I
- X exit
- X case PrintArchiveIndexes:
- X cp /dev/null ~/tmp/netls
- X foreach f ( ${LIST} )
- X ls -RC $f >> /tmp/netls
- X end
- X cd /tmp
- X print netls
- X exit
- X default:
- Xendsw
- END_OF_FILE
- if test 1261 -ne `wc -c <'MakeArchiveIndex.csh'`; then
- echo shar: \"'MakeArchiveIndex.csh'\" unpacked with wrong size!
- fi
- chmod +x 'MakeArchiveIndex.csh'
- # end of 'MakeArchiveIndex.csh'
- fi
- if test -f 'assemble.csh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'assemble.csh'\"
- else
- echo shar: Extracting \"'assemble.csh'\" \(6382 characters\)
- sed "s/^X//" >'assemble.csh' <<'END_OF_FILE'
- X#! /bin/csh -f
- X
- X# Archive management scripts. Use in conjunction with narc
- X
- X# Geoffrey Leach
- X# LatiCorp Inc.
- X# {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- X
- X# assemble Assemble a group of files into an archive directory
- X# archive Put and archive directory in its place
- X# retrieve Get an archive directory into the cwd
- X
- X# This shell script implements an archive management facility. The
- X# idea is that you have a archive whose path is in the environment
- X# variable ARCHIVE. The directories here are your archive.
- X# Files in an archive directory are compressed tar files if they were
- X# put there by this archive. If they were put there by narc, then they
- X# are plain text files, which you will assemble into compressed tar, depending
- X# on how they got there. Moderated archives are handled in a way that
- X# lets you refer to a series of postings with shorthand. BTW, moderated
- X# groups are assumed to be organized by volume in your archive. Retrieve
- X# just helps you get a particular archive file into your cwd.
- X
- X# Usage - options apply as stated in the usage messages
- X#
- X# -a Specify ARCDIR. Forces ARCVOL to ""
- X# -e Extract. Overrides shorthand for moderated groups
- X# -n Specify archive file. $1 defaults
- X# -s "Short" assemble; just get the files
- X# -v Specify ARCVOL
- X
- X
- X# Environment variable usage
- X
- X# ARCHIVE base directory of archive
- X# ARCPATH directory name
- X# ARCVOL subdirectory name for moderated groups
- X
- X# Commands that are used by this script that you might not have
- X
- X# unshar
- X
- Xset MYNAME = $0
- Xset MYNAME = $MYNAME:t
- X
- X# usage
- Xif ( $#argv == 0 ) then
- X echo -n "Usage: $MYNAME [-a archive [-v volume]] "
- X switch ( $MYNAME )
- X case "assemble":
- X echo "[-s] [-e name] [-n archive-name] base-issue [number-of-issues]"
- X exit
- X case "archive":
- X echo "file"
- X exit
- X case "retrieve":
- X echo "file"
- X exit
- X default:
- X echo ""
- X exit
- X endsw
- Xendif
- X
- X# Check for environment usage
- Xif ( ! $?ARCHIVE ) set ARCHIVE
- Xif ( ! $?ARCDIR ) set ARCDIR
- Xif ( ! $?ARCVOL ) set ARCVOL
- X
- X# Check for switches
- Xset SWSCAN
- Xwhile ( $?SWSCAN )
- X switch ( $1 )
- X case -a:
- X set ARCDIR = $2
- X set ARCVOL = ""
- X shift
- X shift
- X breaksw
- X case -e:
- X if ( ! $?EXTRACT ) then
- X set EXTRACT
- X else
- X unset EXTRACT
- X endif
- X shift
- X breaksw
- X case -n:
- X set ARCFILE = $2
- X shift
- X shift
- X breaksw
- X case -s:
- X set SHORT
- X shift
- X breaksw
- X case -v:
- X if ( $2 <= 9 ) then
- X set ARCVOL = v0$2
- X else
- X set ARCVOL = v$2
- X endif
- X shift
- X shift
- X breaksw
- X case -*:
- X echo "Unrecognized option $1"
- X exit
- X default:
- X unset SWSCAN
- X breaksw
- X endsw
- Xend
- X
- Xif ( $ARCDIR == "" ) then
- X echo -n "Archive directory? "
- X set ARCDIR = $<
- Xendif
- X
- Xif ( $ARCVOL == "" ) then
- X switch ( $ARCDIR )
- X case x:
- X case unix:
- X case misc:
- X case games:
- X echo -n "Archive volume? "
- X set ARCVOL = $<
- X if ( $ARCVOL <= 9 ) then
- X set ARCVOL = v0$ARCVOL
- X else
- X set ARCVOL = v$ARCVOL
- X endif
- X breaksw
- X default:
- X breaksw
- X endsw
- Xendif
- Xset PREFIX = ${ARCVOL}i
- X
- Xif ( $ARCVOL == "" ) then
- X set ARCPATH = $ARCHIVE/$ARCDIR
- Xelse
- X set ARCPATH = $ARCHIVE/$ARCDIR/$ARCVOL
- Xendif
- X
- X# Here is where we do the real work
- Xswitch ( $MYNAME )
- X case assemble:
- X
- X # For moderated groups, we usually have the number of the first posting,
- X # and (optionally) the number of postings. These
- X # are combined to give a sequence of file names. Otherwise, we assume
- X # that the argument is the prefix of the file(s) to be retrieved.
- X # There may be more than one file with that name as prefix.
- X switch ( $ARCDIR )
- X case "x":
- X case "unix":
- X case "misc":
- X case "games":
- X if ( ! $?EXTRACT ) then
- X set MODERATED
- X set BASE = $1
- X if ( $#argv == 2 ) then
- X set COUNT = $2
- X else
- X set COUNT = 1
- X endif
- X endif
- X breaksw
- X default:
- X breaksw
- X endsw
- X
- X # Set up the directory structure for the archive.
- X # Conditional so that we can assemble into an existing directory.
- X # ARCF is where we put the raw input for later deletion
- X # FILES is the lis of original files, for later deletion
- X # HDRS contains the .hdr files produced by unshar, so you can
- X # find our later where all of this came from.
- X # PATCHES is where you accumulate patch files. I save these
- X # so they can be un-applied later. Useful if you are
- X # applying unofficial patches to a maintained source.
- X if ( ! $?ARCFILE ) then
- X if ( $?MODERATED ) then
- X echo -n "Archive name? "
- X set ARCFILE = $<
- X else
- X set ARCFILE = $1
- X endif
- X endif
- X if ( ! -d $ARCFILE ) mkdir $ARCFILE
- X cd $ARCFILE
- X if ( ! -d HDRS ) mkdir HDRS
- X if ( ! -d ARCF ) mkdir ARCF
- X if ( ! -d PATCHES ) mkdir PATCHES
- X
- X if ( $?MODERATED ) then
- X while ( $COUNT )
- X if ( $BASE < 10 ) set BASE = 0$BASE
- X if ( $BASE < 100 ) set BASE = 0$BASE
- X set f = $ARCPATH/${PREFIX}${BASE}
- X if ( ! -e $f ) echo $f not found
- X chmod +w $f
- X cp $f .
- X echo $f >> FILES
- X unshar $f:t
- X mv $f:t ARCF
- X @ COUNT = $COUNT - 1
- X @ BASE = $BASE + 1
- X end
- X else
- X foreach f ( $ARCPATH/$1* )
- X chmod +w $f
- X cp $f .
- X echo $f >> FILES
- X # You may want to assemble pre-existing archives. We handle
- X # Compressed files, which may also be tar or shar.
- X set f = $f:t
- X if ( $f:e == "Z" ) then
- X set f = $f:r
- X uncompress $f
- X endif
- X if ( $f:e == "tar" ) then
- X tar xvf $f
- X set f = $f:r
- X else
- X unshar $f:t
- X endif
- X mv $f:t ARCF
- X end
- X endif
- X mv *hdr HDRS
- X
- X if ( -e ark1isdone ) mv ark*isdone ARCF
- X
- X if ( $?SHORT ) exit
- X
- X # This maintains an archive of formatted documentation
- X roffit
- X
- X CheckManifest
- X ls -C
- X exit
- X
- X case archive:
- X if ( ! $?ARCFILE ) then
- X if ( $#argv != 1 ) then
- X echo -n "Archive name? "
- X set ARCFILE = $<
- X else
- X set ARCFILE = $1
- X endif
- X endif
- X if ( ! -d $ARCFILE ) then
- X echo archive: $ARCFILE not found
- X exit
- X endif
- X if ( -e $ARCFILE/FILES ) then
- X set F = ( `cat $ARCFILE/FILES` )
- X rm -r $ARCFILE/FILES
- X else
- X set F
- X endif
- X if ( ! -d $ARCPATH ) then
- X echo "$ARCPATH not found"
- X exit
- X endif
- X if ( -d $ARCFILE/ARCF ) rm -r $ARCFILE/ARCF
- X tar cvf $ARCPATH/$ARCFILE.tar $ARCFILE
- X if ( -e $ARCPATH/$ARCFILE.tar.Z ) rm -f $ARCPATH/$ARCFILE.tar.Z
- X compress $ARCPATH/$ARCFILE.tar
- X chmod -w $ARCPATH/$ARCFILE.tar.Z
- X rm -rf $ARCFILE $F
- X exit
- X
- X case retrieve:
- X set f = $ARCPATH/$1.tar.Z
- X if ( ! -e $f ) then
- X echo $f not found
- X exit
- X endif
- X zcat $f | tar xvf -
- X exit
- X default:
- X exit
- Xendsw
- END_OF_FILE
- if test 6382 -ne `wc -c <'assemble.csh'`; then
- echo shar: \"'assemble.csh'\" unpacked with wrong size!
- fi
- chmod +x 'assemble.csh'
- # end of 'assemble.csh'
- fi
- if test -f 'makemap.csh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'makemap.csh'\"
- else
- echo shar: Extracting \"'makemap.csh'\" \(678 characters\)
- sed "s/^X//" >'makemap.csh' <<'END_OF_FILE'
- X#! /bin/csh -f
- X
- Xset BDIR = /local/bin
- Xset PDIR = /local/lib/palias
- Xset MAPDIR = /local/lib/palias/uumap
- Xset NEWSDIR = /news/comp/mail/maps
- Xset LOG = $PDIR/makemap.log
- X
- Xset BASE = `cat $MAPDIR/.last`
- Xcd $NEWSDIR
- Xset MAPS = ( `ls` )
- Xif ( $#MAPS == 0 ) exit
- X
- Xforeach m ( $MAPS )
- X if ( $m > $BASE ) then
- X $BDIR/unshar -n -c$MAPDIR $m >>& $LOG
- X set NEWMAP
- X endif
- Xend
- Xif ( ! $?NEWMAP ) exit
- X
- Xecho $m > $MAPDIR/.last
- Xcd $PDIR
- Xrm paths.pag paths.dir
- Xmv paths paths.old
- X$BDIR/pathalias Path.* uumap/[du].* | sed -e 's/ ptsfa\!/ /' -e '/^ptsfa/d' | sort | $BDIR/pathprune > paths
- X$BDIR/makedb -o paths paths
- X#add sentinel for uumail >>& $LOG
- X$BDIR/makedb -a -o paths @@@ >>& $LOG
- END_OF_FILE
- if test 678 -ne `wc -c <'makemap.csh'`; then
- echo shar: \"'makemap.csh'\" unpacked with wrong size!
- fi
- chmod +x 'makemap.csh'
- # end of 'makemap.csh'
- fi
- if test -f 'roffit.csh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'roffit.csh'\"
- else
- echo shar: Extracting \"'roffit.csh'\" \(871 characters\)
- sed "s/^X//" >'roffit.csh' <<'END_OF_FILE'
- X#! /bin/csh -f
- X# Find something that might be a man page and 'roff it.
- X
- X# Geoffrey Leach
- X# LatiCorp Inc.
- X# {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- X
- Xset DIR = `pwd`
- Xset DIR = $DIR:t
- X
- Xif ( $#argv == 0 ) then
- X set DOC = `find . \( -name "*.l" -o -name "*.man" -o -name "*.nro" -o -name "*.[1-8]" \) -print`
- Xelse
- X set DOC = ( $* )
- Xendif
- Xforeach f ( $DOC )
- X if ( $f:h != "./ARCF" ) then
- X set D = $ARCHIVE/manl/$f:t
- X if ( $f:t == README ) set $f = ${DIR}.$f
- Xrepeat:
- X if ( -e $D ) then
- X echo -n "Man page $f exists. Ignore(i), overwrite(o) or new name(n) [i]? "
- X set ans = $<
- X switch ( $ans )
- X case "i":
- X default:
- X continue
- X case "o":
- X breaksw
- X case "n":
- X echo -n "Enter new name: "
- X set ans = <$
- X set D = $ARCHIVE/manl/$ans
- X goto repeat
- X breaksw
- X endsw
- X endif
- X nroff -man $f > $D
- X endif
- Xend
- END_OF_FILE
- if test 871 -ne `wc -c <'roffit.csh'`; then
- echo shar: \"'roffit.csh'\" unpacked with wrong size!
- fi
- chmod +x 'roffit.csh'
- # end of 'roffit.csh'
- fi
- if test -f 'narc.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'narc.c'\"
- else
- echo shar: Extracting \"'narc.c'\" \(11664 characters\)
- sed "s/^X//" >'narc.c' <<'END_OF_FILE'
- X/*
- X** Narc -- archive NetNews articles
- X**
- X** Geoffrey Leach
- X** LatiCorp Inc.
- X** {att,bellcore,sun,ames,pyramid}!pacbell!laticorp!geoff
- X*/
- X
- X#include <stdio.h>
- X#include <strings.h>
- X#include <sys/file.h>
- X#include "version.h"
- X#include "patchlevel.h"
- X
- X#define TRUE 1
- X#define FALSE 0
- X#define MATCH 0
- X#define EXISTS 0
- X#define PROMPT 0
- X#define SUBJECT 1
- X#define INDEX 2
- X#define PNULL (char *)0
- X#define FNULL (FILE *)0
- X#define NGNULL (sNewsGroup *)0
- X#define INDEXR "Indexr"
- X
- Xtypedef struct
- X{
- X char * name;
- X char * archive;
- X char * volume_tag;
- X int moderated;
- X} sNewsGroup;
- X
- Xextern char * fgets();
- Xextern char * malloc();
- Xextern char * getenv();
- Xextern char * strpbrk();
- Xextern char * optarg;
- Xextern int optind;
- X
- XsNewsGroup * NewsGroups[100];
- XsNewsGroup prompted = {PNULL, PNULL, PNULL, FALSE};
- XFILE * rc;
- XFILE * tty;
- XFILE * out;
- XFILE * aindex;
- Xchar arcdir[1024];
- Xchar descr[1024];
- Xchar arc_dir[1024];
- Xchar line[1024];
- Xchar head_buf[10240];
- Xchar * head_buf_ptr = head_buf;
- Xchar tmp_file[] = {"Narc.XXXXXX"};
- Xchar arc_file[256];
- Xchar arc_name[256];
- Xchar p_archive[256];
- Xint debug = FALSE;
- Xint named = FALSE;
- Xint repost = FALSE;
- Xint selected = FALSE;
- Xint subjected = FALSE;
- Xint head_buf_lines = 0;
- X
- XsNewsGroup*
- Xlookup(name)
- X char *name;
- X{
- X int i = -1;
- X
- X /*
- X * A little surgery: get rid of the leading "Newsgroups: "
- X * and remove any secondary newsgroups
- X */
- X name += 12;
- X *(strpbrk(name, ",\n")) = '\0';
- X
- X /*
- X * See if this newsgroup was listed in the user's rc file
- X */
- X while ( NewsGroups[++i] )
- X {
- X if ( strcmp(name, NewsGroups[i]->name) == MATCH )
- X return NewsGroups[i];
- X }
- X return NGNULL;
- X}
- X
- Xvoid
- Xrename_article(tmp_file, name)
- X char *tmp_file;
- X char *name;
- X{
- X char ans[10];
- X char rcmd[1024];
- X
- X if ( access(name, R_OK) == EXISTS )
- X {
- X printf("%s exists! (a)ppend, (i)gnore or (r)eplace [r]? ", arc_file);
- X fflush(stdout);
- X fgets(ans, 10, tty);
- X switch ( ans[0] )
- X {
- X default:
- X case 'r':
- X break;
- X case 'a':
- X sprintf(rcmd, "cat %s >> %s", tmp_file, name);
- X if ( debug )
- X printf("%s\n", rcmd);
- X system(rcmd);
- X unlink(tmp_file);
- X return;
- X case 'i':
- X return;
- X }
- X }
- X
- X if ( rename(tmp_file, name) )
- X {
- X sprintf(rcmd, "Unable to rename %s", name);
- X perror(rcmd);
- X exit(1);
- X }
- X}
- X
- Xvoid
- Xclose_article()
- X{
- X /*
- X * The beginning of an article, and not the first.
- X * Therefore, we have an article open that must be closed.
- X */
- X named = FALSE;
- X repost = FALSE;
- X subjected = FALSE;
- X if ( strlen(arc_name) )
- X {
- X fputs(arc_name, aindex);
- X fputs(": ", aindex);
- X fputs(descr, aindex);
- X }
- X fclose(out);
- X
- X if ( selected )
- X {
- X rename_article(tmp_file, arc_file);
- X out = fopen(tmp_file,"w");
- X selected = FALSE;
- X }
- X else
- X rewind(out);
- X}
- X
- Xvoid
- Xchop(str)
- X char * str;
- X{
- X *(str +strlen(str) - 1) = '\0';
- X}
- X
- Xvoid
- Xfgets_buffer()
- X{
- X if ( (head_buf_ptr + strlen(line)) >= (head_buf + sizeof(head_buf)) )
- X {
- X printf("Could not find newsgroup (or volume) within %d lines\n",
- X head_buf_lines);
- X exit(1);
- X }
- X
- X fgets(line, sizeof(line), stdin);
- X strcpy(head_buf_ptr, line);
- X head_buf_ptr += strlen(line) + 1;
- X head_buf_lines++;
- X}
- X
- Xchar *
- Xfgets_unbuffer()
- X{
- X if ( head_buf_lines )
- X {
- X strcpy(line, head_buf_ptr);
- X head_buf_ptr += strlen(line) + 1;
- X head_buf_lines--;
- X return line;
- X }
- X return fgets(line, sizeof(line), stdin);
- X}
- X
- Xvoid
- Xmain(argc, argv)
- X int argc;
- X char *argv[];
- X{
- X int i;
- X int opt;
- X int vol;
- X int mode = INDEX;
- X int name_fd = 0;
- X int article_name = 0;
- X char * cmd;
- X char * name;
- X char * subj;
- X sNewsGroup * NewsGroup;
- X
- X while ( (opt = getopt(argc, argv, "a:px")) != EOF )
- X {
- X switch ( opt )
- X {
- X case 'a':
- X prompted.archive = optarg;
- X break;
- X case 'p':
- X mode = PROMPT;
- X break;
- X case 'x':
- X debug = TRUE;
- X break;
- X default:
- X fprintf(stderr, "Usage: narc [-px] [-a archive]\n");
- X fprintf(stderr, " version %s level %d\n", VERSION, PATCHLEVEL);
- X exit(1);
- X }
- X }
- X
- X /*
- X * Get the archive directory from the environment
- X */
- X strcpy(arcdir, getenv("ARCHIVE"));
- X
- X /*
- X * Read the user's ~/.narc file (if he has one) for the
- X * newsgroups to watch. What we are looking for is
- X * The base of the archive directory (full path) this is the
- X * prefix for the archive directory specified for each newsgroup.
- X * Then, tab separated fields as follows:
- X * newsgroup: what fillows Newsgroups: in the header.
- X * archive: the directory under arcdir.
- X * volume_tag: the tag for the line that says what the volume is
- X * (moderated newsgroups only).
- X * moderated: is this a moderated newsgroup? (0/1)
- X */
- X sprintf(line, "%s/.narcrc", getenv("HOME"));
- X if ( (rc = fopen(line, "r")) != FNULL )
- X {
- X i = 0;
- X while ( fgets(line, sizeof(line), rc ) != PNULL )
- X {
- X NewsGroup =
- X NewsGroups[i++] = (sNewsGroup *)malloc(sizeof(sNewsGroup));
- X
- X *(name = index(line, ':')) = '\0';
- X NewsGroup->name = malloc(strlen(line) + 1);
- X strcpy(NewsGroup->name, line);
- X
- X subj = ++name;
- X if ( (name = index(subj, ':')) == PNULL )
- X {
- X NewsGroup->moderated = FALSE;
- X subj[strlen(subj) - 1] = '\0';
- X }
- X else
- X {
- X NewsGroup->moderated = TRUE;
- X *name = '\0';
- X }
- X NewsGroup->archive = malloc(strlen(subj) + 1);
- X strcpy(NewsGroup->archive, subj);
- X
- X if ( NewsGroup->moderated )
- X {
- X subj = ++name;
- X NewsGroup->volume_tag = malloc(strlen(subj));
- X strncpy(NewsGroup->volume_tag, subj, strlen(subj) - 1);
- X }
- X
- X if ( debug )
- X printf("%s\t%s\t%s\t%d\n", NewsGroup->name,
- X NewsGroup->archive,
- X NewsGroup->volume_tag,
- X NewsGroup->moderated);
- X }
- X fclose(rc);
- X }
- X
- X if ( (tty = fopen("/dev/tty", "r")) == FNULL )
- X {
- X perror("Error opening tty");
- X exit(1);
- X };
- X
- X /*
- X * If the user has not forced an archive, find one.
- X * As we will skip past the first subject line, we need
- X * to buffer the head of the file.
- X */
- X if ( prompted.archive )
- X NewsGroup = &prompted;
- X else
- X {
- X /*
- X * Look for the Newsgroups line in the header
- X */
- X do
- X {
- X fgets_buffer();
- X }
- X while ( strncmp(line, "Newsgroups: ", 12) != MATCH );
- X
- X /*
- X * Is the newsgroup on the list? Note that we only look
- X * at the first newsgroup that's specified.
- X */
- X if ( (NewsGroup = lookup(line)) == NGNULL )
- X {
- X printf("Archive directory for %s? ", line);
- X fflush(stdout);
- X fgets(p_archive, sizeof(p_archive), tty);
- X chop(p_archive);
- X prompted.archive = p_archive;
- X NewsGroup = &prompted;
- X }
- X
- X /*
- X * If we find that we have a moderated newsgroup, we assume
- X * that somewhere there will be a line in the header that tells
- X * us about the current volume and the archive name of the
- X * program that's in this article.
- X */
- X if ( NewsGroup->moderated )
- X {
- X if ( mode != PROMPT )
- X mode = SUBJECT;
- X
- X do
- X {
- X fgets_buffer();
- X }
- X while ( strncmp(line, NewsGroup->volume_tag,
- X strlen(NewsGroup->volume_tag)) != MATCH );
- X
- X vol = atoi(&line[strlen(NewsGroup->volume_tag) + 8 ]);
- X }
- X }
- X
- X /*
- X * Everything that we need to know about output is determined.
- X */
- X if ( NewsGroup->moderated )
- X sprintf(arc_dir, "%s/%s/v%02d", arcdir, NewsGroup->archive, vol);
- X else
- X sprintf(arc_dir, "%s/%s", arcdir, NewsGroup->archive);
- X
- X if ( debug )
- X {
- X printf("Archive directory selected is: %s\n", arc_dir);
- X strcpy(arc_dir, ".");
- X }
- X else
- X {
- X if ( chdir(arc_dir) )
- X {
- X sprintf(arc_file, "Could not chdir to %s", arc_dir);
- X perror(arc_file);
- X exit(1);
- X }
- X }
- X
- X /*
- X * The tmp file is created in the archive directory
- X */
- X mktemp(tmp_file);
- X if ( (out = fopen(tmp_file,"w")) == FNULL )
- X {
- X sprintf(arc_file, "Error opening %s" , tmp_file);
- X perror(arc_file);
- X exit(1);
- X };
- X
- X /*
- X * This is the "scratch" index that gets the raw data from
- X * each article subject. The user will extract one line for
- X * each submission for the "real" index.
- X */
- X if ( (aindex = fopen(INDEXR, "a")) == FNULL )
- X {
- X perror("Error opening index");
- X exit(1);
- X };
- X
- X /*
- X * If we are not moderated and the user has not requested us
- X * to prompt for names, then we need to generate a name. No
- X * advance preparation is required for this; if the .names file
- X * does not exist, we will start naming at 000.
- X */
- X if ( !NewsGroup -> moderated && mode != PROMPT )
- X {
- X if ( (name_fd = open(".names", O_RDWR | O_CREAT, 0666)) == NULL )
- X {
- X perror("Error opening .names");
- X exit(1);
- X }
- X
- X read(name_fd, &article_name, sizeof(int));
- X lseek(name_fd, 0L, L_SET);
- X }
- X
- X /*
- X * Now that we have somewhere to put the input, restart the input and
- X * skip the first line which is (we hope) Path: ..
- X */
- X head_buf_ptr = head_buf;
- X fgets_unbuffer(line);
- X fputs(line, out);
- X
- X /*
- X * Process stdin until EOF. We expect to have a sequence of net news
- X * articles, each of which has a subject line.
- X */
- X while ( fgets_unbuffer() != PNULL )
- X {
- X if ( strncmp(line, "Path: ", 6) == MATCH )
- X close_article();
- X
- X /*
- X * Now that we have the new file (if that's what happened),
- X * dispose of the current line
- X */
- X fputs(line, out);
- X
- X /*
- X * Does this line define the archive name?
- X */
- X if ( !named && (strncmp(line, "Archive-name: ", 13) == MATCH) )
- X {
- X /*
- X * Process only one archive name per article
- X */
- X named = TRUE;
- X
- X strcpy(arc_name, &line[14]);
- X *(strpbrk(arc_name, "/ \n")) = '\0';
- X }
- X
- X /*
- X * Do we have a Subject?
- X */
- X if ( !subjected && (strncmp(line, "Subject: ", 9) == MATCH) )
- X {
- X /*
- X * Process only one Subject: per article
- X */
- X selected = TRUE;
- X subjected = TRUE;
- X
- X /*
- X * Generate a name, using the subject line is possible
- X */
- X
- X /*
- X * First, drop the "Subject: "
- X */
- X subj = &line[9];
- X
- X /*
- X * Then, if this is a re-posting note the fact so that we
- X * don't hassle the user if the first posting happens to
- X * be in the archive and skip the "REPOST "
- X */
- X if ( strncmp(subj, "REPOST ", 7) == MATCH )
- X {
- X subj += 7;
- X repost = TRUE;
- X }
- X
- X /*
- X * How we generate the name depends on what kind of newsgroup
- X */
- X switch ( mode )
- X {
- X case SUBJECT: /* moderated groups */
- X /*
- X * Tell the user what's happening
- X */
- X printf("%s", subj);
- X
- X /*
- X * Name should begin with something like v02i023:
- X * Assume this, and use the fist 7 characters for
- X * the file name
- X */
- X strncpy(arc_file, subj, 7);
- X break;
- X case PROMPT: /* user wants us to prompt for name */
- X /*
- X * This is the article
- X */
- X printf("%s", subj);
- X fputs("Output file? ", stdout);
- X fflush(stdout);
- X fgets(arc_name, sizeof(arc_name), tty);
- X chop(arc_name);
- X if ( strlen(arc_name) == 0 )
- X {
- X /*
- X * User declines to save this item
- X */
- X selected = FALSE;
- X continue;
- X }
- X strcpy(arc_file, arc_name);
- X break;
- X case INDEX: /* generate name */
- X sprintf(arc_file, "%03d", article_name++);
- X strcpy(arc_name, arc_file);
- X /*
- X * Tell the user what we did
- X */
- X printf("%s: %s", arc_file, subj);
- X break;
- X default:
- X break;
- X }
- X strcpy(descr, subj);
- X }
- X }
- X
- X close_article();
- X unlink(tmp_file);
- X
- X if ( name_fd )
- X {
- X write(name_fd, &article_name, sizeof(int));
- X close(name_fd);
- X }
- X}
- END_OF_FILE
- if test 11664 -ne `wc -c <'narc.c'`; then
- echo shar: \"'narc.c'\" unpacked with wrong size!
- fi
- # end of 'narc.c'
- fi
- if test -f 'patchlevel.h' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'patchlevel.h'\"
- else
- echo shar: Extracting \"'patchlevel.h'\" \(21 characters\)
- sed "s/^X//" >'patchlevel.h' <<'END_OF_FILE'
- X#define PATCHLEVEL 0
- END_OF_FILE
- if test 21 -ne `wc -c <'patchlevel.h'`; then
- echo shar: \"'patchlevel.h'\" unpacked with wrong size!
- fi
- # end of 'patchlevel.h'
- fi
- if test -f 'version.h' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'version.h'\"
- else
- echo shar: Extracting \"'version.h'\" \(22 characters\)
- sed "s/^X//" >'version.h' <<'END_OF_FILE'
- X#define VERSION "1.0"
- END_OF_FILE
- if test 22 -ne `wc -c <'version.h'`; then
- echo shar: \"'version.h'\" unpacked with wrong size!
- fi
- # end of 'version.h'
- fi
- if test -f 'Makefile' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'Makefile'\"
- else
- echo shar: Extracting \"'Makefile'\" \(117 characters\)
- sed "s/^X//" >'Makefile' <<'END_OF_FILE'
- Xnarc: narc.o
- X cc -O -o narc narc.c
- X
- Xclean:
- X -rm core *.o narc
- X
- Xnarc.o: narc.c
- Xnarc.o: version.h
- Xnarc.o: patchlevel.h
- END_OF_FILE
- if test 117 -ne `wc -c <'Makefile'`; then
- echo shar: \"'Makefile'\" unpacked with wrong size!
- fi
- # end of 'Makefile'
- fi
- echo shar: End of shell archive.
- exit 0
-
-
-